﻿#pragma once
namespace GeometryTools {
	/**
	 * \brief  is lift side
	 * \param x1
	 * \param y1
	 * \param x2
	 * \param y2
	 * \param x3
	 * \param y3
	 * \return right <0 left > 0  on line = 0
	 */
	inline float isLeft(const float& x1, const float& y1, const float& x2, const float& y2, const float& x3,
		const float& y3) {
		return (x2 - x1) * (y3 - y1) - (x3 - x1) * (y2 - y1);
	}

	/**
	 * \brief segment and segment intersect
	 * 这种相交是指的不包括线段的端点那种相交,
	 * \return intersect true
	 */
	inline bool isIntersect(const float(&seg1)[4], const float(&seg2)[4]) {
		float res1 = isLeft(seg1[0], seg1[1], seg1[2], seg1[3], seg2[0], seg2[1]);
		float res2 = isLeft(seg1[0], seg1[1], seg1[2], seg1[3], seg2[2], seg2[3]);
		if (res1 * res2 < 0) {
			res1 = isLeft(seg2[0], seg2[1], seg2[2], seg2[3], seg1[0], seg1[1]);
			res2 = isLeft(seg2[0], seg2[1], seg2[2], seg2[3], seg1[2], seg1[3]);
			if (res1 * res2 < 0) {
				return true;
			}
		}
		return false;
	}

	/**
	 * \brief 完全不相交 false ,有相交的可能性 true
	 * \param seg1 x1 y1 x2 y2
	 * \param seg2 x3 y3 x4 y4
	 * \return
	 */
	inline bool quickDenyIntersect(const float(&seg1)[4], const float(&seg2)[4]) {
		float minX1 = seg1[2];
		float maxX1 = seg1[0];
		if (seg1[0] < seg1[2]) {
			minX1 = seg1[0];
			maxX1 = seg1[2];
		}
		float minY1 = seg1[3];
		float maxY1 = seg1[1];
		if (seg1[1] < seg1[3]) {
			minY1 = seg1[1];
			maxY1 = seg1[3];
		}

		float minX2 = seg2[2];
		float maxX2 = seg2[0];
		if (seg2[0] < seg2[2]) {
			minX2 = seg2[0];
			maxX2 = seg2[2];
		}
		float minY2 = seg2[3];
		float maxY2 = seg2[1];
		if (seg2[1] < seg2[3]) {
			minY2 = seg2[1];
			maxY2 = seg2[3];
		}
		if (minX1 > maxX2 || maxX1 < minX2) {
			return false;
		}
		if (minY1 > maxY2 || maxY1 < minY2) {
			return false;
		}
		return true;
	}
}
